/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package villapancha2011;

import java.util.List;
import java.util.LinkedList;
import java.util.Random;

import org.javahispano.javacup.modelo.*;

/**
 *
 * @author Jorgeao
 */
public class Chutar extends VillaPanchaBase {

    public Chutar(TacticaVillaPancha2011 t) {
        super(t);
    }


    void chutar() {

        for (int i : situacionPartido().puedenRematar()) {
            // Acordarse de siempre preguntar si el grosso esta disponible, si no tiene ordenes anteriores
            Grosso g = getGrosso(i);
            if (esGrossoDisponible(g)) {
                for (double anguloVertical = 10d; anguloVertical < 65d; anguloVertical = anguloVertical + 5d) {
                    double av = anguloVertical * Math.PI / 180d;
                    //velocidad
                    double fuerza = 0.60;
                    double r = 0, z = 0, distancia = 0;

                    do {
                        double vel = Constantes.getVelocidadRemate(situacionPartido().getRemateJugador(g.ordinal())) * fuerza;
                        //direccion;
                        double dz = vel * Math.sin(av);
                        double dr = vel * Math.cos(av);
                        AbstractTrayectoria trayectoria = new TrayectoriaAire(dr, dz, 0, 0);
                        //coordenadas
                        for (int tiempo = 5; tiempo < 200; tiempo++) {

                            r = trayectoria.getX((double) tiempo / 60d) * Constantes.AMPLIFICA_VEL_TRAYECTORIA;
                            z = trayectoria.getY((double) tiempo / 60d) * Constantes.AMPLIFICA_VEL_TRAYECTORIA;

                            boolean alturaOptima = z < Constantes.ALTO_ARCO && z > Constantes.ALTO_ARCO * 0.8 ;

                            distancia = situacionPartido().misJugadores()[g.ordinal()].distancia(situacionPartido().rivales()[0]);
                            if (Math.abs(r - distancia) < 3 && alturaOptima) {
                                tactica.comandos.add(new ComandoGolpearBalon(g.ordinal(), Constantes.centroArcoSup, fuerza, anguloVertical));
                                System.out.println("TIRO Fuerza: " + fuerza + "; distancia: " + distancia + "; angulo: " + anguloVertical);
                                anguloVertical = 90d;
                                fuerza = 1d;
                                tiempo = 200;
                            }
                        }
                        fuerza += 0.002;
                    } while (fuerza <= 1.0);
                }

                tactica.comandos.add(new ComandoGolpearBalon(g.ordinal(), Constantes.centroArcoSup, 1, 15));

            }
        }
    }
    /*void chutar() {
        //TODO: Implementar

        // Pregunta: conviene que tratemos de patear con todos los que devuelve puedenRematar?
        //             o solo pateamos con el primero??
        // Respuesta: el framework elige uno aleatorio entre los que pueden rematar, así que aprovechamos uno solo, el de mejor remate y precision
        // Recontrarespuesta: ya vimos que no es taaaan así ;)
        JugadorDetalle mejor = null;
        int mejorIndice = -1;
        for (int i : situacionPartido().puedenRematar()) {
            // Acordarse de siempre preguntar si el grosso esta disponible, si no tiene ordenes anteriores
            Grosso g = getGrosso(i);
            if (esGrossoDisponible(g)) {
                if (mejor == null) {
                    mejor = tactica.detalle.getJugadores()[i];
                    mejorIndice = i;
                } else {
                    JugadorDetalle jugadorGrosso = tactica.detalle.getJugadores()[i];
                    if (jugadorGrosso.getPresicion() > mejor.getPresicion() || (jugadorGrosso.getRemate() > mejor.getRemate()
                            && jugadorGrosso.getPresicion() == mejor.getPresicion())) {
                        mejor = jugadorGrosso;
                        mejorIndice = i;
                    }
                }
            }
        }

        if (situacionPartido().misJugadores()[mejorIndice].distancia(Constantes.centroArcoSup) < Constantes.ANCHO_AREA_GRANDE + 5) {
            // TODO: Calcular tiro, pa probar van todos al medio y sin altura
            tactica.comandos.add(new ComandoGolpearBalon(mejorIndice, Constantes.centroArcoSup, 1, false)); //(new ComandoGolpearBalon(i, Constantes.centroArcoSup.moverPosicion(tmp, 0), 1, 15));
        } else if (situacionPartido().misJugadores()[mejorIndice].distancia(Constantes.centroArcoSup) <= 25) {
            double anguloAlto = situacionPartido().misJugadores()[mejorIndice].distancia(Constantes.centroArcoSup);
            //TODO: Calcular mejor anguloAlto
            tactica.comandos.add(new ComandoGolpearBalon(mejorIndice, Constantes.centroArcoSup, 1, 15));
        } else if (situacionPartido().misJugadores()[mejorIndice].distancia(Constantes.centroArcoSup) < 30) {
            tactica.comandos.add(new ComandoGolpearBalon(mejorIndice, Constantes.centroArcoSup, 1, 16));
        } else {

            tactica.comandos.add(new ComandoGolpearBalon(mejorIndice, Constantes.centroArcoSup, 1, true));
        }
        // Y acordarse de marcar que fue usado
        MarcarGrossoUtilizado(getGrosso(mejorIndice));
    }*/
}
